unity 查找物体的方法(包括隐藏物体) | 您所在的位置:网站首页 › unity gameobjectfind找不到 › unity 查找物体的方法(包括隐藏物体) |
一般而言,我们在游戏中寻找物体可以使用 GameObject.Find(),GameObject.FindGameObjectWithTag(),FindObjectOfType()等这方式,在游戏运行的过程中,这几种方法各自都能运行的良好(有效率上的区别,我没有做过测试),但是当我们在做一些编辑器扩展的时候,我们遇到的一些情况这些方法就不能处理了,比如寻找场景中的隐藏物体:
这个时候上述的方法就不能够使用,当然,可以通过transform.Find()去寻找一个父物体下的所有包括隐藏的物体,但是有局限性,只能寻找已显示物体的子物体,其子物体的子物体不能够查询到。 如果想要找到场景内所有的隐藏物体,我们可以使用Resources.FindObjectsOfTypeAll(),这个方法,在unity的官方API上有示例代码: (返回场景中的所有物体) using System.Collections.Generic; using UnityEngine; using UnityEditor; public class ExampleScript : MonoBehaviour { List GetAllObjectsOnlyInScene() { List objectsInScene = new List(); foreach (GameObject go in Resources.FindObjectsOfTypeAll(typeof(GameObject)) as GameObject[]) { if (!EditorUtility.IsPersistent(go.transform.root.gameObject) && !(go.hideFlags == HideFlags.NotEditable || go.hideFlags == HideFlags.HideAndDontSave)) objectsInScene.Add(go); } return objectsInScene; } }官方API上说明,这种方法可以列出任何类型的已加载的Unity对象,包括游戏对象,预制体,材质,网格等等,它还会列出内部对象以及禁用对象,因此在使用的时候需要做一些处理。
在示例代码中,EditorUtility.IsPersistent方法用来检查是否查找对象存储在磁盘里,像是以资产形式存储的预制体,美术资源等等,会返回为true,如果是在场景中的物体,比如普通物体,和预制体的实例,则会返回为false。 hideFlags则是用来标记物体是否被隐藏、保存、是否可被修改。
有了官方的示范,我们便可以照葫芦画瓢做一些其他的操作,就比如官方给的方法返回的是场景中的全部物体,我们可以根据寻找物体的tag,名称,自定义寻找到的物体:
根据tag找到场景中的一组物体: private static List FindObjects(string tag) { List gameObjects = new List(); foreach (GameObject go in Resources.FindObjectsOfTypeAll(typeof(GameObject))) { if (!EditorUtility.IsPersistent(go.transform.root.gameObject) && !(go.hideFlags == HideFlags.NotEditable || go.hideFlags == HideFlags.HideAndDontSave)) { if (go.tag == tag) gameObjects.Add(go); } } return gameObjects; }根据名称找到场景内的特定物体: private static GameObject FindObject2(string name) { foreach(GameObject go in Resources.FindObjectsOfTypeAll(typeof(GameObject))) { if(!EditorUtility.IsPersistent(go.transform.root.gameObject) && !(go.hideFlags == HideFlags.NotEditable || go.hideFlags == HideFlags.HideAndDontSave)) { if (go.name == name) return go; } } return null; }注:根据此方法得出的场景中的游戏对象列表,不是按照Hierarchy中的目录顺序。 这个方法需要引用unityEditor,因此在游戏逻辑中不能够用此方法。 |
CopyRight 2018-2019 实验室设备网 版权所有 |